package cn.cyh.queue_service.service;

import cn.cyh.queue_service.model.dto.PageRequest;
import cn.cyh.queue_service.model.dto.PageResult;
import cn.cyh.queue_service.model.dto.WindowRequest;
import cn.cyh.queue_service.model.entity.Window;
import cn.cyh.queue_service.model.vo.WindowVO;

import java.util.List;

/**
 * 窗口服务接口
 */
public interface WindowService {
    
    /**
     * 创建窗口
     * 
     * @param request 窗口请求
     * @return 窗口ID
     */
    Long createWindow(WindowRequest request);
    
    /**
     * 更新窗口
     * 
     * @param id 窗口ID
     * @param request 窗口请求
     * @return 是否更新成功
     */
    boolean updateWindow(Long id, WindowRequest request);
    
    /**
     * 删除窗口
     * 
     * @param id 窗口ID
     * @return 是否删除成功
     */
    boolean deleteWindow(Long id);
    
    /**
     * 根据ID获取窗口
     * 
     * @param id 窗口ID
     * @return 窗口视图对象
     */
    WindowVO getWindowById(Long id);
    
    /**
     * 分页查询窗口列表
     * 
     * @param pageRequest 分页请求
     * @return 分页结果
     */
    PageResult<WindowVO> getWindowList(PageRequest pageRequest);
    
    /**
     * 获取所有开放状态的窗口
     * 
     * @return 窗口视图对象列表
     */
    List<WindowVO> getOpenWindows();
    
    /**
     * 更新窗口状态
     * 
     * @param id 窗口ID
     * @param status 状态(OPEN-开放, PAUSE-暂停, CLOSED-关闭)
     * @return 是否更新成功
     */
    boolean updateStatus(Long id, String status);
    
    /**
     * 更新窗口当前服务的业务类型
     * 
     * @param id 窗口ID
     * @param serviceTypeId 业务类型ID
     * @return 是否更新成功
     */
    boolean updateServiceType(Long id, Long serviceTypeId);
    
    /**
     * 更新窗口当前处理的票号
     * 
     * @param id 窗口ID
     * @param ticketNumber 票号
     * @return 是否更新成功
     */
    boolean updateCurrentNumber(Long id, String ticketNumber);
    
    /**
     * 获取指定业务类型的可用窗口列表
     * 
     * @param serviceTypeId 业务类型ID
     * @return 窗口列表
     */
    List<Window> getAvailableWindowsByServiceType(Long serviceTypeId);
    
    /**
     * 更新窗口等待人数
     * 
     * @param id 窗口ID
     * @param waitingCount 等待人数
     * @return 是否更新成功
     */
    boolean updateWaitingCount(Long id, Integer waitingCount);
} 